/*-------------------------------------------------------------------------
 *
 * buffile.h
 *	  大型缓冲临时文件的管理。
 *
 * BufFile 例程提供了对由 fd.c 管理的虚拟文件描述符之上的 stdio 的部分替代。当前它们仅支持对虚拟文件的缓冲访问，而没有 stdio 的任何格式化功能。这对当前需求来说已经足够，但如果有必要，功能集合可以扩展。
 *
 * BufFile 还支持处理超过操作系统文件大小限制和/或在 int 中可表示的最大偏移量的临时文件。将其拆分为一个可以单独访问的模块可能更好，但目前我们不需要没有缓冲访问的超大临时文件。
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/storage/buffile.h
 *
 *-------------------------------------------------------------------------
 */

#ifndef BUFFILE_H
#define BUFFILE_H

#include "storage/fileset.h"

/* BufFile 是一种不透明类型，其细节在 buffile.c 之外不可知。 */

typedef struct BufFile BufFile;

/*
 * buffile.c 中函数的原型
 */

extern BufFile *BufFileCreateTemp(bool interXact);
extern void BufFileClose(BufFile *file);
extern size_t BufFileRead(BufFile *file, void *ptr, size_t size);
extern void BufFileWrite(BufFile *file, void *ptr, size_t size);
extern int	BufFileSeek(BufFile *file, int fileno, off_t offset, int whence);
extern void BufFileTell(BufFile *file, int *fileno, off_t *offset);
extern int	BufFileSeekBlock(BufFile *file, long blknum);
extern int64 BufFileSize(BufFile *file);
extern long BufFileAppend(BufFile *target, BufFile *source);

extern BufFile *BufFileCreateFileSet(FileSet *fileset, const char *name);
extern void BufFileExportFileSet(BufFile *file);
extern BufFile *BufFileOpenFileSet(FileSet *fileset, const char *name,
								   int mode, bool missing_ok);
extern void BufFileDeleteFileSet(FileSet *fileset, const char *name,
								 bool missing_ok);
extern void BufFileTruncateFileSet(BufFile *file, int fileno, off_t offset);

#endif							/* BUFFILE_H */
